Introduction (20 points)

Scientific Question

(5 points for specific, measurable, and clear scientific question)

Given that the p53 family of proteins (p53, p63, and p73) serve overlapping functions in normal development and regulating the expression of genes that control apoptosis in humans, how do they compare in terms of amino acid sequence identity and 3D protein structure?

Background

(5 points for background on the protein/gene/species of interest and where the data is sourced from)

The p53 gene is a tumor suppressor gene most frequently mutated in human cancers. The resulting p53 protein is a transcription factor that regulates the expression of genes that control apoptosis and cell cycle arrest in response to genotoxic and cellular stress. p63 and p73, two close homologs of p53, comprise the p53 family of proteins. Despite having the ability to transactivate p53 target genes and exert p53-like functions such as DNA-damage induced apoptosis and cell cycle arrest, p63 and p73 do not function as classical Knudson-type tumor suppressors and are rarely mutated in human cancers (DeYoung 2007). Furthermore, in addition to having redundant p53-like functions, p63 and p73 possess an extended C-terminal region containing a sterile alpha motif (SAM) known to regulate development which is not alternatively spliced in p53. This suggests that p63 and p73 play a separate additional role in the regulation of normal development (Levrero 2000). Interestingly, further research hints that the relationship between the p53 family of proteins is a lot more complex than we might think: some p63/p73 isoforms are p53-interfering– they not only lack p53-like functions, but also act as dominant negatives against p53 activity (Yang 2002).

The intricate relationship between the p53 transcription factor family members and their overlapping but also opposing functions have been subject to extensive research and debate. Here we attempt to shed light to this question by investigating the amino acid sequence identity and structural homology of p53 family members.

Scientific Hypothesis

(5 points for clear, specific, and measurable scientific hypothesis that is in the form of an if-then statement)

If the p53 family of proteins all serve the redundant function in normal development and regulating the expression of genes that control apoptosis in humans, then we would expect the amino acid sequence identity to be >50% and the DNA-binding domains to share structural homology.

Analyses and Data

(5 points for description of what analyses were done and how the data was downloaded for the project)

To compare and contrast the amino acid sequences of p53, p63, and p73, multiple sequence alignment with the MUSCLE algorithm was performed. This method will highlight differences in their sequence, including point mutations and indels. Between the three multiple sequence alignment algorithms in the msa package, the MUSCLE algorithm was used as it especially works well with proteins, and ClustalOmega is not suitable for alignment of sequences with large internal indels. The amino acid sequences of p53 (UniProt ID: P04637), p63 (Q9H3D4), and p73 (O15350) were downloaded in FASTA format from the UniProt database. To visualize the alignment, the msaPrettyPrint() function was used as it allows us to create a sequence logo, which displays a graphical representation of the sequence conservation of amino acids. It is a highly customizable multiple sequence alignment plot, assigning different colors for certain groups of amino acids to highlight differences between the sequences.

To compare the structural homology of p53 family members, homology modeling and structural bioinformatics were performed. Here, we focus only on the DNA-binding domain (DBD), as the p53 family members bind to very similar DNA motifs. The PDB files were obtained from RCSB PDB (Research Collaboratory for Structural Bioinformatics Protein Data Bank): p53 (Accession number: 2FEJ), p63 (2RMN), p73 (2XWC). The PDB files are then compared by alignment and superposition of the three structures using the pdbaln() function, calculating sequence identity using the seqidentity() function, and calculating the RMSD to measure structural similarity. The NGLVieweR() function was then used to visualize the 3D structures; this will show the folding and structure of the proteins, as well as looking at whether there are parts of the domain that is truncated/missing in one compared to the other.

Loading in Packages (15 points)

  1. BiocManager: provides tools for installing and managing packages from Bioconductor.
  2. BioStrings: memory efficient string containers, string matching algorithms, and other utilities, for fast manipulation of large biological sequences or sets of sequences.
  3. seqinr: used to retrieve and analyze biological sequences (DNA and protein) such as the read.fasta() function.
  4. msa: provides a unified interface to the three multiple sequence alignment algorithms in this package: ‘ClustalW’, ‘ClustalOmega’, and ‘MUSCLE’.
  5. muscle: performs multiple sequence alignments of nucleotide and amino acid sequences.
  6. bio3d: provide utilities for the analysis of protein structure and sequence data.
  7. NGLVieweR: used to visualize and interact with Protein Data Bank (PDB) and structural files in R.
# Uncomment commands to install the necessary packages
# if (!require("BiocManager", quietly = TRUE))
    # install.packages("BiocManager")
# BiocManager::install()
library(BiocManager)
Bioconductor version 3.14 (BiocManager 1.30.18), R 4.1.3 (2022-03-10)
Bioconductor version '3.14' is out-of-date; the current release version '3.15' is available with R
  version '4.2'; see https://bioconductor.org/install

Attaching package: ‘BiocManager’

The following object is masked from ‘package:msa’:

    version
# BiocManager::install("Biostrings")
library(Biostrings)
# install.packages("seqinr")
library(seqinr)

Attaching package: ‘seqinr’

The following object is masked from ‘package:Biostrings’:

    translate

The following object is masked from ‘package:matrixStats’:

    count
# BiocManager::install("msa")
library(msa)
# BiocManager::install("muscle")
library(muscle)
# install.packages("bio3d", dependencies=TRUE)
library(bio3d)

Attaching package: ‘bio3d’

The following objects are masked from ‘package:seqinr’:

    consensus, read.fasta, write.fasta

The following object is masked from ‘package:Biostrings’:

    mask

The following object is masked from ‘package:SummarizedExperiment’:

    trim

The following object is masked from ‘package:GenomicRanges’:

    trim

The following object is masked from ‘package:IRanges’:

    trim
# install.packages("NGLVieweR")
# install.packages("remotes")
# remotes::install_github("nvelden/NGLVieweR")
library(NGLVieweR)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Performing Bioinformatics Analysis (20 points)

Multiple Sequence Alignment with msaMuscle: this function calls the multiple sequence alignment algorithm MUSCLE on nucleotide or amino acid sequences. Multiple sequence alignment is a technique where three or more biological sequences are arranged next to one another to identify regions of similarity that may show functional, structural, and/or evolutionary relationships. This process involves maximal matching between the sequences according to a scoring-based algorithm. Below is code for a multiple sequence alignment on proteins p53, p63, and p73.

# Amino acid sequences of p53, p63, and p73 proteins are downloaded from UniProtKB as fasta files, ensuring they are saved to the same directory as the R notebook

# Read fasta files using the function readAAStringSet from the Biostrings package and assign the appropriate fasta file to the variables "p53_seq", "p63_seq", and "p73_seq"
p53_seq <- readAAStringSet("p53.fasta")
p63_seq <- readAAStringSet("p63.fasta")
p73_seq <- readAAStringSet("p73.fasta")

# Print out each sequence to ensure the fasta file is read successfully
p53_seq
AAStringSet object of length 1:
    width seq                                                                   names               
[1]   393 MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLS...GSRAHSSHLKSKKGQSTSRHKKLMFKTEGPDSD sp|P04637|P53_HUM...
p63_seq
AAStringSet object of length 1:
    width seq                                                                   names               
[1]   680 MNFETSRCATLQYCPDPYIQRFVETPAHFSWKE...QTISFPPRDEWNDFNFDMDARRNKQQRIKEEGE sp|Q9H3D4|P63_HUM...
p73_seq
AAStringSet object of length 1:
    width seq                                                                   names               
[1]   636 MAQSTATSPDGGTTFEHLWSSLEPDSTYFDLPQ...GGPDEWADFGFDLPDCKARKQPIKEEFTEAEIH sp|O15350|P73_HUM...
# Create a vector containing the 3 amino acid sequences and assign it to the variable "p53_family" in order to run the msa function on these 3 sequences in the same alignment
p53family <- c(p53_seq, p63_seq, p73_seq)

# Confirm the number of sequences in the vector
length(p53family)
[1] 3
# Run the msa function with MUSCLE algorithm on "p53family" and assign it to the variable msa for multiple sequence alignment
msa <- msaMuscle(p53family)

# Show the full length of the alignment
print(msa, show = "complete")

MsaAAMultipleAlignment with 3 rows and 704 columns
    aln (1..74)                                                                names
[1] -------------MEEPQSDPSVEPP-----------------------LSQETFSDLWKLLPE--------NN sp|P04637|P53_HUM...
[2] MNFETSRCATLQYCPDPYIQRFVETPAHFSWKESYYRSTMSQSTQTNEFLSPEVFQHIWDFLEQPICSVQPIDL sp|Q9H3D4|P63_HUM...
[3] -----------------MAQSTATSP-----------------------DGGTTFEHLWSSLEP--------DS sp|O15350|P73_HUM...
Con -------------???P??Q??VE?P-----------------------LS?ETF?HLW??LE?--------D? Consensus 

    aln (75..148)                                                              names
[1] VLSPLPSQ-------------AMDDLMLSPDDIEQ--W--FT------------EDPGPDEAPRMPEAAPPVAP sp|P04637|P53_HUM...
[2] NFVDEPSEDGATNKI----EISMDCIRMQDSDLSDPMWPQYTNLGLLNSMDQQIQNGSSSTSPYNTDHAQNSVT sp|Q9H3D4|P63_HUM...
[3] TYFDLPQSSRGNNEVVGGTDSSMDVFHLEGMTTSV-----MAQFNLLSSTMDQMSSRAASASPYTPEHAASVPT sp|O15350|P73_HUM...
Con ???DLPS?????N??----??SMD???L???D?S?--W--?T???LL?S???Q??????S?SPY?PEHA??V?T Consensus 

    aln (149..222)                                                             names
[1] APAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDS sp|P04637|P53_HUM...
[2] AP-SPYAQPSSTFDALSPSPAIPSNTDYPGPHSFDVSFQQSSTAKSATWTYSTELKKLYCQIAKTCPIQIKVMT sp|Q9H3D4|P63_HUM...
[3] H--SPYAQPSSTFDTMSPAPVIPSNTDYPGPHHFEVTFQQSSTAKSATWTYSPLLKKLYCQIAKTCPIQIKVST sp|O15350|P73_HUM...
Con AP-SPYAQPSSTFD??SPSP?IPSNTDYPGPH?F?V?FQQSSTAKSATWTYSP?LKKLYCQIAKTCPIQIKV?T Consensus 

    aln (223..296)                                                             names
[1] TPPPGTRVRAMAIYKQSQHMTEVVRRCPHHERCSD-SDG-LAPPQHLIRVEGNLRVEYLDDRNTFRHSVVVPYE sp|P04637|P53_HUM...
[2] PPPQGAVIRAMPVYKKAEHVTEVVKRCPNHELSREFNEGQIAPPSHLIRVEGNSHAQYVEDPITGRQSVLVPYE sp|Q9H3D4|P63_HUM...
[3] PPPPGTAIRAMPVYKKAEHVTDVVKRCPNHELGRDFNEGQSAPASHLIRVEGNNLSQYVDDPVTGRQSVVVPYE sp|O15350|P73_HUM...
Con PPPPGT?IRAMPVYKKAEHVTEVVKRCPNHEL?RDFNEGQ?APPSHLIRVEGN???QYVDDP?TGRQSVVVPYE Consensus 

    aln (297..370)                                                             names
[1] PPEVGSDCTTIHYNYMCNSSCMGGMNRRPILTIITLEDSSGNLLGRNSFEVRVCACPGRDRRTEEENLRKKGE- sp|P04637|P53_HUM...
[2] PPQVGTEFTTVLYNFMCNSSCVGGMNRRPILIIVTLETRDGQVLGRRCFEARICACPGRDRKADEDSIRKQQV- sp|Q9H3D4|P63_HUM...
[3] PPQVGTEFTTILYNFMCNSSCVGGMNRRPILIIITLEMRDGQVLGRRSFEGRICACPGRDRKADEDHYREQQAL sp|O15350|P73_HUM...
Con PPQVGTEFTTILYNFMCNSSCVGGMNRRPILIIITLE?RDGQVLGRRSFE?RICACPGRDRKADED??RKQQ?- Consensus 

    aln (371..444)                                                             names
[1] -PHHELPPGSTKRALPNNTSSSPQ-----PKKKPLDGEYFTLQIRGRERFEMFRELNEALELKD---------- sp|P04637|P53_HUM...
[2] -SDSTKNGDGTKRPFRQNTHGIQM--TSIKKRRSPDDELLYLPVRGRETYEMLLKIKESLELMQYLPQHTIETY sp|Q9H3D4|P63_HUM...
[3] NESSAKNGAASKRAFKQSPPAVPALGAGVKKRRHGDEDTYYLQVRGRENFEILMKLKESLELMELVPQPLVDSY sp|O15350|P73_HUM...
Con -??S?KNG??TKRAF?QNT???P?--???KKRR??D?E??YLQVRGRE?FEML?KLKESLELM???PQ?????Y Consensus 

    aln (445..518)                                                             names
[1] -------------------------------------------------------------------------- sp|P04637|P53_HUM...
[2] RQQQQQQHQHLLQKQTSIQSPSSYGNSSPPLNKMN-SMNKLPSVSQLIN--PQQRNALTPTTIPDGMGANIPMM sp|Q9H3D4|P63_HUM...
[3] RQQQQ-----LLQRPSHLQ-PPSYGPVLSPMNKVHGGMNKLPSVNQLVGQPPPHSSAATPNLGPVGPGM-LNNH sp|O15350|P73_HUM...
Con RQQQQ-----LLQ?????Q-P?SYG????P?NK??-?MNKLPSV?QL??--P????A?TP???P?G?G?-???? Consensus 

    aln (519..592)                                                             names
[1] ----AQAGKEPGGSRAH--------------------------------------------------------- sp|P04637|P53_HUM...
[2] GTHMPMAGDMNGLSPTQALPPPLSMPSTSHCTPPPPYPTDCSIVSFLARLGCSSCLDYFTTQGLTTIYQIEHYS sp|Q9H3D4|P63_HUM...
[3] GHAVPANGEMSSSHSAQ------SMVSGSHCTPPPPYHADPSLVSFLTGLGCPNCIEYFTSQGLQSIYHLQNLT sp|O15350|P73_HUM...
Con G???P?AG?M?G?S?AQ------SM?S?SHCTPPPPY??D?S?VSFL??LGC??C??YFT?QGL??IY?????? Consensus 

    aln (593..666)                                                             names
[1] ---------------------------------SSHLKSKKGQSTS---------------------------- sp|P04637|P53_HUM...
[2] MDDLASLKIPEQFRHAIWKGILDHRQLHEFSSPSHLLRTPSSASTVSVGSSETRGERVIDAVRFTLRQTISFPP sp|Q9H3D4|P63_HUM...
[3] IEDLGALKIPEQYRMTIWRGLQDLKQGHDYSTAQQLLRSSNAATISIGGSGELQRQRVMEAVHFRVRHTITIPN sp|O15350|P73_HUM...
Con ??DL??LKIPEQ?R??IW?G??D??Q?H??S??S?LLRS???ASTS??GS?E????RV??AV?F??R?TI??P? Consensus 

    aln (667..704)                         names
[1] ---------------------RHKKLMFKTEGPDSD-- sp|P04637|P53_HUM...
[2] R-------DEWNDFNFDMDARRNKQQRIKEEGE----- sp|Q9H3D4|P63_HUM...
[3] RGGPGGGPDEWADFGFDLPDCKARKQPIKEEFTEAEIH sp|O15350|P73_HUM...
Con R-------DEW?DF?FD????R?KKQ?IKEEG????-- Consensus 

Structural Bioinformatics using bio3d: pdb files of the DNA-binding domains of p53, p63, and p73 are first compared by alignment and superposition of the three structures. This creates multiple sequence alignments from a list of PDB files returning aligned sequence and structure records. Then, percent sequence identity scores for aligned sequences are calculated using seqidentity() function, which returns a numeric matrix with all pairwise identity values. The percent identity value is a single numeric score determined for each pair of aligned sequences. It measures the number of identical residues (“matches”) in relation to the length of the alignment. Finally, root mean square deviation (RMSD) is calculated to measure structural similarity of the DNA-binding domains of the three proteins.

# Read pdb files of the DNA binding domains of p53 (2FEJ), p63 (2RMN), and p73 (2XWC) using the read.pdb() function from the bio3d package by providing the file paths (or PDB accession numbers) and assign them to the variables "p53_pdb", "p63_pdb", and "p73_pdb)
p53_pdb <- read.pdb("2fej.pdb")
p63_pdb <- read.pdb("2rmn.pdb")
p73_pdb <- read.pdb("2xwc.pdb")
   PDB has ALT records, taking A only, rm.alt=TRUE
# Create a multiple sequence alignment of the PDB files using the pdbaln() function and assign it to the variable "pdbs"
pdbs <- pdbaln(c("2fej.pdb", "2rmn.pdb", "2xwc.pdb"), fit=TRUE, web.args = list(email = "akristin@ucsd.edu"))
Reading PDB files:
2fej.pdb
2rmn.pdb
2xwc.pdb
..   PDB has ALT records, taking A only, rm.alt=TRUE
.

Extracting sequences
Warning in system(paste(exefile, ver), ignore.stderr = TRUE, ignore.stdout = TRUE) :
  error in running command


Will try to align sequences online...

Job successfully submited (job ID: muscle-R20220605-050739-0407-59238102-p2m)
Waiting for job to finish...Done.

pdb/seq: 1   name: 2fej.pdb 
pdb/seq: 2   name: 2rmn.pdb 
pdb/seq: 3   name: 2xwc.pdb 
   PDB has ALT records, taking A only, rm.alt=TRUE
# Print "pdbs" to view the alignment
pdbs
           1        .         .         .         .         .         .         70 
2fej.pdb   ----------SSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPP
2rmn.pdb   GSSTFDALSPSPAIPSNTDYPGPHSFDVSFQQSSTAKSATWTYSTELKKLYCQIAKTCPIQIKVMTPPPQ
2xwc.pdb   ----------APVIPSNTDYPGPHHFEVTFQQSSTAKSATWTYSPLLKKLYCQIAKTCPIQIKVSTPPPP
                        ^**^  * *   * ^ *  * **** * ***  * *^^**^*****^*^ * ^ **  
           1        .         .         .         .         .         .         70 

          71        .         .         .         .         .         .         140 
2fej.pdb   GTRVRAMAIYKQSQHMTEVVRRCPHHERCSD-SDG-LAPPQHLIRVEGNLRVEYLDDRNTFRHSVVVPYE
2rmn.pdb   GAVIRAMPVYKKAEHVTEVVKRCPNHELSREFNEGQIAPPSHLIRVEGNSHAQYVEDPITGRQSVLVPYE
2xwc.pdb   GTAIRAMPVYKKAEHVTDVVKRCPNHELGRDFNEGQSAPASHLIRVEGNNLSQYVDDPVTGRQSVVVPYE
           *  ^*** ^**   *^*^**^*** **   ^  ^*  **  ********    *^^*  * * **^**** 
          71        .         .         .         .         .         .         140 

         141        .         .         .         .         .         .         210 
2fej.pdb   PPEVGSDCTTIHYNYMCNSSCMGGMNRRPILTIITLEDSSGNLLGRNSFEVRVCACPGRDRRTEEENLRK
2rmn.pdb   PPQVGTEFTTVLYNFMCNSSCVGGMNRRPILIIVTLETRDGQVLGRRCFEARICACPGRDRKADEDSIRK
2xwc.pdb   PPQVGTEFTTILYNFMCNSSCVG---RRPILIIITLEMRDGQVLGRRSFEGRICACPGRDRKADEDHYRE
           ** **^^ **^ **^******^*   ***** *^***   *^^***  ** *^********^ ^*^  *  
         141        .         .         .         .         .         .         210 

         211        .         .  233 
2fej.pdb   K--------GEPHH---------
2rmn.pdb   QQVSDSTKNGDAFRQNTHGIQMT
2xwc.pdb   A--------ENLYFQ--------
                                   
         211        .         .  233 

Call:
  pdbaln(files = c("2fej.pdb", "2rmn.pdb", "2xwc.pdb"), fit = TRUE, 
    web.args = list(email = "akristin@ucsd.edu"))

Class:
  pdbs, fasta

Alignment dimensions:
  3 sequence rows; 233 position columns (201 non-gap, 32 gap) 

+ attr: xyz, resno, b, chain, id, ali, resid, sse, call
# Calculate percent sequence identity and assign the resulting matrix array to the variable "seqid"
seqid <- seqidentity(pdbs)

# Rename column and row names for easy interpretation
colnames(seqid) <- c("p53", "p63", "p73")
rownames(seqid) <- c("p53", "p63", "p73")

# Print renamed matrix
seqid
      p53   p63   p73
p53 1.000 0.554 0.567
p63 0.554 1.000 0.824
p73 0.567 0.824 1.000
# Create a function to interpret sequence identity values that returns "homolog" if value is > 0.5 or 50% and returns "non-homolog" if value is =< 0.5
interpret <- function(seqid){
  if (seqid > 0.5) {
    print ("homolog")
    return(seqid)
  } else {
    print ("non-homolog")
    return (seqid)
  }
}

# Create variables for each pairing of the 3 proteins
p53andp63 <- seqid[2,1]
p53andp73 <- seqid[3,1]
p63andp73 <- seqid[2,3]

# Use the created function to interpret sequence identity values
interpret(p53andp63)
[1] "homolog"
[1] 0.554
interpret(p53andp73)
[1] "homolog"
[1] 0.567
interpret(p63andp73)
[1] "homolog"
[1] 0.824
# Calculate RMSD to measure structural similarity
rmsd <- rmsd(pdbs, fit = TRUE)
Warning in rmsd(pdbs, fit = TRUE) :
  No indices provided, using the 201 non NA positions
# Rename column and row names for easy interpretation
colnames(rmsd) <- c("p53", "p63", "p73")
rownames(rmsd) <- c("p53", "p63", "p73")

# Print renamed matrix
rmsd
      p53   p63   p73
p53 0.000 4.980 2.979
p63 4.980 0.000 4.004
p73 2.979 4.004 0.000

Plotting the Results (15 points)

msaPrettyPrint: msaPrettyPrint is a function that allows graphical representation of the multiple sequence alignment that shows the sequence conservation of amino acids in a sequence logo. The left hand side shows the ID and name of the 3 proteins (p53, p63, and p73) and the consensus sequence based on this alignment. The colorful stack of letters at each position on top of the sequence alignment is the sequence logo, where the relative sizes of the letters indicate their frequency in the sequences.

msaPrettyPrint(msa, output="tex", showNames="left", showLogo="top", logoColors="rasmol", shadingMode="functional", shadingModeArg="structure", showLegend=FALSE, askForOverwrite=FALSE)

knitr::include_graphics("msaSequenceLogos1.png")

knitr::include_graphics("msaSequenceLogos2.png")

knitr::include_graphics("msaSequenceLogos3.png")

NGLVieweR: NGLVieweR is used to visualize the 3D structure of the pdb files. Below is the code to visualize the structure of the DNA-binding domains of proteins p53, p63, and p73, using their PDB accession codes 2FEJ, 2RMN, and 2XWC respectively.

## Source:: https://github.com/nvelden/NGLVieweR#:~:text=NGLvieweR%20provides%20an%20R%20interface,in%20R%20and%20Shiny%20applications.
## Source: https://cran.r-project.org/web/packages/NGLVieweR/vignettes/NGLVieweR.html

NGLVieweR("2FEJ") %>%
addRepresentation("cartoon")

NGLVieweR("2RMN") %>%
addRepresentation("cartoon")

NGLVieweR("2XWC") %>%
addRepresentation("cartoon")

Analyzing the Results (15 points)

Multiple sequence alignment on p53, p63, and p73 protein sequences were performed using the msa function with the MUSCLE algorithm. A dash in one sequence (-) indicates a deletion in that residue position, or a missing/truncated sequence compared to the other sequences aligned. As shown in the alignment, p63 and p73 are more similar in length (680 and 636 amino acid residues) compared to p53 (only 393 residues). It can be observed in the alignment that p53 has a shorter/truncated C-terminal region compared to p63 and p73, as p53 shows mostly dashes towards the end of the alignment (approximately positions 434-704). This supports the previous findings that an extended C-terminal region containing a sterile alpha motif (SAM) known to regulate development is alternatively spliced in p63 and p73 but not in p53, which suggests that p63 and p73 play an additional separate role in regulating normal development (Levrero 2000). Despite so, the majority of the DNA-binding domain residues (usually defined as residues 94-292 in p53) are conserved across the 3 proteins as evident from the sequence logo.

Following this observation, the DNA-binding domains of p53, p63, and p73 are analyzed by performing a multiple sequence alignment on the pdb files of the DNA-binding domain structures of the 3 proteins. As shown in the alignment, there are less dashes observed, meaning there aren’t many indels in the DBD, residues in the DBD of the 3 proteins are mostly conserved. Using the resulting pdb alignment, their sequence identity is calculated using the seqidentity() function, which returns a matrix of sequence identity values between the 3 proteins. Using the created interpret() function, it can be observed that all 3 proteins are “homologs” to each other as their sequence identity is greater than 50%. The sequence identity between p53 and p63 is 55.4%; p53 and p73 is 56.7%; p63 and p73 is 82.4%. Consistent with our previous observations from the aligments performed, p63 and p73 are more similar to each other than to p53. The sequence identity between p53 and p63 compared to p53 and p73 is almost the same, with p73 being slightly more similar to p53. Finally, root-mean-square deviation values is calculated using the rmsd() function. The rmsd value gives the average deviation between the corresponding atoms of two proteins: the smaller the rmsd, the more similar the two structures; the rmsd would be 0 between identical structures. The rmsd values matrix shows that the value between p53 and p63 is 4.980; p53 and p73 is 2.979; p63 and p73 is 4.004. Generally, a value of < 2 is considered structurally very similar. Based on these values, p53 and p73 is most structurally similar, followed by p63 and p73, and finally p53 and p63 although they are all above 2. Meaning, despite their high sequence identities, the 3 proteins are structurally distinct in their DBD. This is evident by visualization of the structures using NGLVieweR as well; while all the 3 structures seem distinct, p53 and p73 look the most similar as they are spherical in shape, while p63 looks like it has two “domains” with a bridge connecting the two.

Based on these analyses, my hypothesis was partially correct, as the sequence identities between the 3 proteins are >50%. However, it is still and unclear whether the p53 family of proteins serve the same or distinct functions; consistent with what we know today, the p53 family has some overlapping functions but also distinct ones, which can be explained by their seemingly similar sequence identities, especially in the DNA-binding domain, but not so similar in structure.

LS0tCnRpdGxlOiAiUHJvamVjdCAyRDogRmluYWwgUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgSW50cm9kdWN0aW9uICgyMCBwb2ludHMpCiMjIyBTY2llbnRpZmljIFF1ZXN0aW9uIAojIyMjICg1IHBvaW50cyBmb3Igc3BlY2lmaWMsIG1lYXN1cmFibGUsIGFuZCBjbGVhciBzY2llbnRpZmljIHF1ZXN0aW9uKQpHaXZlbiB0aGF0IHRoZSBwNTMgZmFtaWx5IG9mIHByb3RlaW5zIChwNTMsIHA2MywgYW5kIHA3Mykgc2VydmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb25zIGluIG5vcm1hbCBkZXZlbG9wbWVudCBhbmQgcmVndWxhdGluZyB0aGUgZXhwcmVzc2lvbiBvZiBnZW5lcyB0aGF0IGNvbnRyb2wgYXBvcHRvc2lzIGluIGh1bWFucywgaG93IGRvIHRoZXkgY29tcGFyZSBpbiB0ZXJtcyBvZiBhbWlubyBhY2lkIHNlcXVlbmNlIGlkZW50aXR5IGFuZCAzRCBwcm90ZWluIHN0cnVjdHVyZT8KCiMjIyBCYWNrZ3JvdW5kIAojIyMjICg1IHBvaW50cyBmb3IgYmFja2dyb3VuZCBvbiB0aGUgcHJvdGVpbi9nZW5lL3NwZWNpZXMgb2YgaW50ZXJlc3QgYW5kIHdoZXJlIHRoZSBkYXRhIGlzIHNvdXJjZWQgZnJvbSkKVGhlIHA1MyBnZW5lIGlzIGEgdHVtb3Igc3VwcHJlc3NvciBnZW5lIG1vc3QgZnJlcXVlbnRseSBtdXRhdGVkIGluIGh1bWFuIGNhbmNlcnMuIFRoZSByZXN1bHRpbmcgcDUzIHByb3RlaW4gaXMgYSB0cmFuc2NyaXB0aW9uIGZhY3RvciB0aGF0IHJlZ3VsYXRlcyB0aGUgZXhwcmVzc2lvbiBvZiBnZW5lcyB0aGF0IGNvbnRyb2wgYXBvcHRvc2lzIGFuZCBjZWxsIGN5Y2xlIGFycmVzdCBpbiByZXNwb25zZSB0byBnZW5vdG94aWMgYW5kIGNlbGx1bGFyIHN0cmVzcy4gcDYzIGFuZCBwNzMsIHR3byBjbG9zZSBob21vbG9ncyBvZiBwNTMsIGNvbXByaXNlIHRoZSBwNTMgZmFtaWx5IG9mIHByb3RlaW5zLiBEZXNwaXRlIGhhdmluZyB0aGUgYWJpbGl0eSB0byB0cmFuc2FjdGl2YXRlIHA1MyB0YXJnZXQgZ2VuZXMgYW5kIGV4ZXJ0IHA1My1saWtlIGZ1bmN0aW9ucyBzdWNoIGFzIEROQS1kYW1hZ2UgaW5kdWNlZCBhcG9wdG9zaXMgYW5kIGNlbGwgY3ljbGUgYXJyZXN0LCBwNjMgYW5kIHA3MyBkbyBub3QgZnVuY3Rpb24gYXMgY2xhc3NpY2FsIEtudWRzb24tdHlwZSB0dW1vciBzdXBwcmVzc29ycyBhbmQgYXJlIHJhcmVseSBtdXRhdGVkIGluIGh1bWFuIGNhbmNlcnMgKERlWW91bmcgMjAwNykuIEZ1cnRoZXJtb3JlLCBpbiBhZGRpdGlvbiB0byBoYXZpbmcgcmVkdW5kYW50IHA1My1saWtlIGZ1bmN0aW9ucywgcDYzIGFuZCBwNzMgcG9zc2VzcyBhbiBleHRlbmRlZCBDLXRlcm1pbmFsIHJlZ2lvbiBjb250YWluaW5nIGEgc3RlcmlsZSBhbHBoYSBtb3RpZiAoU0FNKSBrbm93biB0byByZWd1bGF0ZSBkZXZlbG9wbWVudCB3aGljaCBpcyBub3QgYWx0ZXJuYXRpdmVseSBzcGxpY2VkIGluIHA1My4gVGhpcyBzdWdnZXN0cyB0aGF0IHA2MyBhbmQgcDczIHBsYXkgYSBzZXBhcmF0ZSBhZGRpdGlvbmFsIHJvbGUgaW4gdGhlIHJlZ3VsYXRpb24gb2Ygbm9ybWFsIGRldmVsb3BtZW50IChMZXZyZXJvIDIwMDApLiBJbnRlcmVzdGluZ2x5LCBmdXJ0aGVyIHJlc2VhcmNoIGhpbnRzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwNTMgZmFtaWx5IG9mIHByb3RlaW5zIGlzIGEgbG90IG1vcmUgY29tcGxleCB0aGFuIHdlIG1pZ2h0IHRoaW5rOiBzb21lIHA2My9wNzMgaXNvZm9ybXMgYXJlIHA1My1pbnRlcmZlcmluZy0tIHRoZXkgbm90IG9ubHkgbGFjayBwNTMtbGlrZSBmdW5jdGlvbnMsIGJ1dCBhbHNvIGFjdCBhcyBkb21pbmFudCBuZWdhdGl2ZXMgYWdhaW5zdCBwNTMgYWN0aXZpdHkgKFlhbmcgMjAwMikuCgpUaGUgaW50cmljYXRlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwNTMgdHJhbnNjcmlwdGlvbiBmYWN0b3IgZmFtaWx5IG1lbWJlcnMgYW5kIHRoZWlyIG92ZXJsYXBwaW5nIGJ1dCBhbHNvIG9wcG9zaW5nIGZ1bmN0aW9ucyBoYXZlIGJlZW4gc3ViamVjdCB0byBleHRlbnNpdmUgcmVzZWFyY2ggYW5kIGRlYmF0ZS4gSGVyZSB3ZSBhdHRlbXB0IHRvIHNoZWQgbGlnaHQgdG8gdGhpcyBxdWVzdGlvbiBieSBpbnZlc3RpZ2F0aW5nIHRoZSBhbWlubyBhY2lkIHNlcXVlbmNlIGlkZW50aXR5IGFuZCBzdHJ1Y3R1cmFsIGhvbW9sb2d5IG9mIHA1MyBmYW1pbHkgbWVtYmVycy4KCiMjIyBTY2llbnRpZmljIEh5cG90aGVzaXMgCiMjIyMgKDUgcG9pbnRzIGZvciBjbGVhciwgc3BlY2lmaWMsIGFuZCBtZWFzdXJhYmxlIHNjaWVudGlmaWMgaHlwb3RoZXNpcyB0aGF0IGlzIGluIHRoZSBmb3JtIG9mIGFuIGlmLXRoZW4gc3RhdGVtZW50KSAKSWYgdGhlIHA1MyBmYW1pbHkgb2YgcHJvdGVpbnMgYWxsIHNlcnZlIHRoZSByZWR1bmRhbnQgZnVuY3Rpb24gaW4gbm9ybWFsIGRldmVsb3BtZW50IGFuZCByZWd1bGF0aW5nIHRoZSBleHByZXNzaW9uIG9mIGdlbmVzIHRoYXQgY29udHJvbCBhcG9wdG9zaXMgaW4gaHVtYW5zLCB0aGVuIHdlIHdvdWxkIGV4cGVjdCB0aGUgYW1pbm8gYWNpZCBzZXF1ZW5jZSBpZGVudGl0eSB0byBiZSA+NTAlIGFuZCB0aGUgRE5BLWJpbmRpbmcgZG9tYWlucyB0byBzaGFyZSBzdHJ1Y3R1cmFsIGhvbW9sb2d5LgoKIyMjIEFuYWx5c2VzIGFuZCBEYXRhIAojIyMjICg1IHBvaW50cyBmb3IgZGVzY3JpcHRpb24gb2Ygd2hhdCBhbmFseXNlcyB3ZXJlIGRvbmUgYW5kIGhvdyB0aGUgZGF0YSB3YXMgZG93bmxvYWRlZCBmb3IgdGhlIHByb2plY3QpClRvIGNvbXBhcmUgYW5kIGNvbnRyYXN0IHRoZSBhbWlubyBhY2lkIHNlcXVlbmNlcyBvZiBwNTMsIHA2MywgYW5kIHA3MywgbXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50IHdpdGggdGhlIE1VU0NMRSBhbGdvcml0aG0gd2FzIHBlcmZvcm1lZC4gVGhpcyBtZXRob2Qgd2lsbCBoaWdobGlnaHQgZGlmZmVyZW5jZXMgaW4gdGhlaXIgc2VxdWVuY2UsIGluY2x1ZGluZyBwb2ludCBtdXRhdGlvbnMgYW5kIGluZGVscy4gQmV0d2VlbiB0aGUgdGhyZWUgbXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50IGFsZ29yaXRobXMgaW4gdGhlIG1zYSBwYWNrYWdlLCB0aGUgTVVTQ0xFIGFsZ29yaXRobSB3YXMgdXNlZCBhcyBpdCBlc3BlY2lhbGx5IHdvcmtzIHdlbGwgd2l0aCBwcm90ZWlucywgYW5kIENsdXN0YWxPbWVnYSBpcyBub3Qgc3VpdGFibGUgZm9yIGFsaWdubWVudCBvZiBzZXF1ZW5jZXMgd2l0aCBsYXJnZSBpbnRlcm5hbCBpbmRlbHMuIFRoZSBhbWlubyBhY2lkIHNlcXVlbmNlcyBvZiBwNTMgKFVuaVByb3QgSUQ6IFAwNDYzNyksIHA2MyAoUTlIM0Q0KSwgYW5kIHA3MyAoTzE1MzUwKSB3ZXJlIGRvd25sb2FkZWQgaW4gRkFTVEEgZm9ybWF0IGZyb20gdGhlIFVuaVByb3QgZGF0YWJhc2UuIFRvIHZpc3VhbGl6ZSB0aGUgYWxpZ25tZW50LCB0aGUgbXNhUHJldHR5UHJpbnQoKSBmdW5jdGlvbiB3YXMgdXNlZCBhcyBpdCBhbGxvd3MgdXMgdG8gY3JlYXRlIGEgc2VxdWVuY2UgbG9nbywgd2hpY2ggZGlzcGxheXMgYSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlcXVlbmNlIGNvbnNlcnZhdGlvbiBvZiBhbWlubyBhY2lkcy4gSXQgaXMgYSBoaWdobHkgY3VzdG9taXphYmxlIG11bHRpcGxlIHNlcXVlbmNlIGFsaWdubWVudCBwbG90LCBhc3NpZ25pbmcgZGlmZmVyZW50IGNvbG9ycyBmb3IgY2VydGFpbiBncm91cHMgb2YgYW1pbm8gYWNpZHMgdG8gaGlnaGxpZ2h0IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHNlcXVlbmNlcy4KClRvIGNvbXBhcmUgdGhlIHN0cnVjdHVyYWwgaG9tb2xvZ3kgb2YgcDUzIGZhbWlseSBtZW1iZXJzLCBob21vbG9neSBtb2RlbGluZyBhbmQgc3RydWN0dXJhbCBiaW9pbmZvcm1hdGljcyB3ZXJlIHBlcmZvcm1lZC4gSGVyZSwgd2UgZm9jdXMgb25seSBvbiB0aGUgRE5BLWJpbmRpbmcgZG9tYWluIChEQkQpLCBhcyB0aGUgcDUzIGZhbWlseSBtZW1iZXJzIGJpbmQgdG8gdmVyeSBzaW1pbGFyIEROQSBtb3RpZnMuIFRoZSBQREIgZmlsZXMgd2VyZSBvYnRhaW5lZCBmcm9tIFJDU0IgUERCIChSZXNlYXJjaCBDb2xsYWJvcmF0b3J5IGZvciBTdHJ1Y3R1cmFsIEJpb2luZm9ybWF0aWNzIFByb3RlaW4gRGF0YSBCYW5rKTogcDUzIChBY2Nlc3Npb24gbnVtYmVyOiAyRkVKKSwgcDYzICgyUk1OKSwgcDczICgyWFdDKS4gVGhlIFBEQiBmaWxlcyBhcmUgdGhlbiBjb21wYXJlZCBieSBhbGlnbm1lbnQgYW5kIHN1cGVycG9zaXRpb24gb2YgdGhlIHRocmVlIHN0cnVjdHVyZXMgdXNpbmcgdGhlIHBkYmFsbigpIGZ1bmN0aW9uLCBjYWxjdWxhdGluZyBzZXF1ZW5jZSBpZGVudGl0eSB1c2luZyB0aGUgc2VxaWRlbnRpdHkoKSBmdW5jdGlvbiwgYW5kIGNhbGN1bGF0aW5nIHRoZSBSTVNEIHRvIG1lYXN1cmUgc3RydWN0dXJhbCBzaW1pbGFyaXR5LiBUaGUgTkdMVmlld2VSKCkgZnVuY3Rpb24gd2FzIHRoZW4gdXNlZCB0byB2aXN1YWxpemUgdGhlIDNEIHN0cnVjdHVyZXM7IHRoaXMgd2lsbCBzaG93IHRoZSBmb2xkaW5nIGFuZCBzdHJ1Y3R1cmUgb2YgdGhlIHByb3RlaW5zLCBhcyB3ZWxsIGFzIGxvb2tpbmcgYXQgd2hldGhlciB0aGVyZSBhcmUgcGFydHMgb2YgdGhlIGRvbWFpbiB0aGF0IGlzIHRydW5jYXRlZC9taXNzaW5nIGluIG9uZSBjb21wYXJlZCB0byB0aGUgb3RoZXIuIAoKIyMgTG9hZGluZyBpbiBQYWNrYWdlcyAoMTUgcG9pbnRzKQoxLiBCaW9jTWFuYWdlcjogcHJvdmlkZXMgdG9vbHMgZm9yIGluc3RhbGxpbmcgYW5kIG1hbmFnaW5nIHBhY2thZ2VzIGZyb20gQmlvY29uZHVjdG9yLgoyLiBCaW9TdHJpbmdzOiBtZW1vcnkgZWZmaWNpZW50IHN0cmluZyBjb250YWluZXJzLCBzdHJpbmcgbWF0Y2hpbmcgYWxnb3JpdGhtcywgYW5kIG90aGVyIHV0aWxpdGllcywgZm9yIGZhc3QgbWFuaXB1bGF0aW9uIG9mIGxhcmdlIGJpb2xvZ2ljYWwgc2VxdWVuY2VzIG9yIHNldHMgb2Ygc2VxdWVuY2VzLiAKMy4gc2VxaW5yOiB1c2VkIHRvIHJldHJpZXZlIGFuZCBhbmFseXplIGJpb2xvZ2ljYWwgc2VxdWVuY2VzIChETkEgYW5kIHByb3RlaW4pIHN1Y2ggYXMgdGhlIHJlYWQuZmFzdGEoKSBmdW5jdGlvbi4KNC4gbXNhOiBwcm92aWRlcyBhIHVuaWZpZWQgaW50ZXJmYWNlIHRvIHRoZSB0aHJlZSBtdWx0aXBsZSBzZXF1ZW5jZSBhbGlnbm1lbnQgYWxnb3JpdGhtcyBpbiB0aGlzIHBhY2thZ2U6IOKAmENsdXN0YWxX4oCZLCDigJhDbHVzdGFsT21lZ2HigJksIGFuZCDigJhNVVNDTEXigJkuCjUuIG11c2NsZTogcGVyZm9ybXMgbXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50cyBvZiBudWNsZW90aWRlIGFuZCBhbWlubyBhY2lkIHNlcXVlbmNlcy4KNi4gYmlvM2Q6IHByb3ZpZGUgdXRpbGl0aWVzIGZvciB0aGUgYW5hbHlzaXMgb2YgcHJvdGVpbiBzdHJ1Y3R1cmUgYW5kIHNlcXVlbmNlIGRhdGEuCjcuIE5HTFZpZXdlUjogdXNlZCB0byB2aXN1YWxpemUgYW5kIGludGVyYWN0IHdpdGggUHJvdGVpbiBEYXRhIEJhbmsgKFBEQikgYW5kIHN0cnVjdHVyYWwgZmlsZXMgaW4gUi4KCmBgYHtyfQojIFVuY29tbWVudCBjb21tYW5kcyB0byBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMKIyBpZiAoIXJlcXVpcmUoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQogICAgIyBpbnN0YWxsLnBhY2thZ2VzKCJCaW9jTWFuYWdlciIpCiMgQmlvY01hbmFnZXI6Omluc3RhbGwoKQpsaWJyYXJ5KEJpb2NNYW5hZ2VyKQojIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJCaW9zdHJpbmdzIikKbGlicmFyeShCaW9zdHJpbmdzKQojIGluc3RhbGwucGFja2FnZXMoInNlcWluciIpCmxpYnJhcnkoc2VxaW5yKQojIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJtc2EiKQpsaWJyYXJ5KG1zYSkKIyBCaW9jTWFuYWdlcjo6aW5zdGFsbCgibXVzY2xlIikKbGlicmFyeShtdXNjbGUpCiMgaW5zdGFsbC5wYWNrYWdlcygiYmlvM2QiLCBkZXBlbmRlbmNpZXM9VFJVRSkKbGlicmFyeShiaW8zZCkKIyBpbnN0YWxsLnBhY2thZ2VzKCJOR0xWaWV3ZVIiKQojIGluc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKQojIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJudmVsZGVuL05HTFZpZXdlUiIpCmxpYnJhcnkoTkdMVmlld2VSKQpgYGAKCiMjIFBlcmZvcm1pbmcgQmlvaW5mb3JtYXRpY3MgQW5hbHlzaXMgKDIwIHBvaW50cykKIyMjIE11bHRpcGxlIFNlcXVlbmNlIEFsaWdubWVudCB3aXRoIG1zYU11c2NsZTogdGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgbXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50IGFsZ29yaXRobSBNVVNDTEUgb24gbnVjbGVvdGlkZSBvciBhbWlubyBhY2lkIHNlcXVlbmNlcy4gTXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50IGlzIGEgdGVjaG5pcXVlIHdoZXJlIHRocmVlIG9yIG1vcmUgYmlvbG9naWNhbCBzZXF1ZW5jZXMgYXJlIGFycmFuZ2VkIG5leHQgdG8gb25lIGFub3RoZXIgdG8gaWRlbnRpZnkgcmVnaW9ucyBvZiBzaW1pbGFyaXR5IHRoYXQgbWF5IHNob3cgZnVuY3Rpb25hbCwgc3RydWN0dXJhbCwgYW5kL29yIGV2b2x1dGlvbmFyeSByZWxhdGlvbnNoaXBzLiBUaGlzIHByb2Nlc3MgaW52b2x2ZXMgbWF4aW1hbCBtYXRjaGluZyBiZXR3ZWVuIHRoZSBzZXF1ZW5jZXMgYWNjb3JkaW5nIHRvIGEgc2NvcmluZy1iYXNlZCBhbGdvcml0aG0uIEJlbG93IGlzIGNvZGUgZm9yIGEgbXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50IG9uIHByb3RlaW5zIHA1MywgcDYzLCBhbmQgcDczLgpgYGB7cn0KIyBBbWlubyBhY2lkIHNlcXVlbmNlcyBvZiBwNTMsIHA2MywgYW5kIHA3MyBwcm90ZWlucyBhcmUgZG93bmxvYWRlZCBmcm9tIFVuaVByb3RLQiBhcyBmYXN0YSBmaWxlcywgZW5zdXJpbmcgdGhleSBhcmUgc2F2ZWQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBSIG5vdGVib29rCgojIFJlYWQgZmFzdGEgZmlsZXMgdXNpbmcgdGhlIGZ1bmN0aW9uIHJlYWRBQVN0cmluZ1NldCBmcm9tIHRoZSBCaW9zdHJpbmdzIHBhY2thZ2UgYW5kIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgZmFzdGEgZmlsZSB0byB0aGUgdmFyaWFibGVzICJwNTNfc2VxIiwgInA2M19zZXEiLCBhbmQgInA3M19zZXEiCnA1M19zZXEgPC0gcmVhZEFBU3RyaW5nU2V0KCJwNTMuZmFzdGEiKQpwNjNfc2VxIDwtIHJlYWRBQVN0cmluZ1NldCgicDYzLmZhc3RhIikKcDczX3NlcSA8LSByZWFkQUFTdHJpbmdTZXQoInA3My5mYXN0YSIpCgojIFByaW50IG91dCBlYWNoIHNlcXVlbmNlIHRvIGVuc3VyZSB0aGUgZmFzdGEgZmlsZSBpcyByZWFkIHN1Y2Nlc3NmdWxseQpwNTNfc2VxCnA2M19zZXEKcDczX3NlcQoKIyBDcmVhdGUgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgMyBhbWlubyBhY2lkIHNlcXVlbmNlcyBhbmQgYXNzaWduIGl0IHRvIHRoZSB2YXJpYWJsZSAicDUzX2ZhbWlseSIgaW4gb3JkZXIgdG8gcnVuIHRoZSBtc2EgZnVuY3Rpb24gb24gdGhlc2UgMyBzZXF1ZW5jZXMgaW4gdGhlIHNhbWUgYWxpZ25tZW50CnA1M2ZhbWlseSA8LSBjKHA1M19zZXEsIHA2M19zZXEsIHA3M19zZXEpCgojIENvbmZpcm0gdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gdGhlIHZlY3RvcgpsZW5ndGgocDUzZmFtaWx5KQoKIyBSdW4gdGhlIG1zYSBmdW5jdGlvbiB3aXRoIE1VU0NMRSBhbGdvcml0aG0gb24gInA1M2ZhbWlseSIgYW5kIGFzc2lnbiBpdCB0byB0aGUgdmFyaWFibGUgIm1zYSIgZm9yICJtdWx0aXBsZSBzZXF1ZW5jZSBhbGlnbm1lbnQiCm1zYSA8LSBtc2FNdXNjbGUocDUzZmFtaWx5KQoKIyBTaG93IHRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgYWxpZ25tZW50CnByaW50KG1zYSwgc2hvdyA9ICJjb21wbGV0ZSIpCmBgYAoKIyMjIFN0cnVjdHVyYWwgQmlvaW5mb3JtYXRpY3MgdXNpbmcgYmlvM2Q6IHBkYiBmaWxlcyBvZiB0aGUgRE5BLWJpbmRpbmcgZG9tYWlucyBvZiBwNTMsIHA2MywgYW5kIHA3MyBhcmUgZmlyc3QgY29tcGFyZWQgYnkgYWxpZ25tZW50IGFuZCBzdXBlcnBvc2l0aW9uIG9mIHRoZSB0aHJlZSBzdHJ1Y3R1cmVzLiBUaGlzIGNyZWF0ZXMgbXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50cyBmcm9tIGEgbGlzdCBvZiBQREIgZmlsZXMgcmV0dXJuaW5nIGFsaWduZWQgc2VxdWVuY2UgYW5kIHN0cnVjdHVyZSByZWNvcmRzLiBUaGVuLCBwZXJjZW50IHNlcXVlbmNlIGlkZW50aXR5IHNjb3JlcyBmb3IgYWxpZ25lZCBzZXF1ZW5jZXMgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgc2VxaWRlbnRpdHkoKSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIG51bWVyaWMgbWF0cml4IHdpdGggYWxsIHBhaXJ3aXNlIGlkZW50aXR5IHZhbHVlcy4gVGhlIHBlcmNlbnQgaWRlbnRpdHkgdmFsdWUgaXMgYSBzaW5nbGUgbnVtZXJpYyBzY29yZSBkZXRlcm1pbmVkIGZvciBlYWNoIHBhaXIgb2YgYWxpZ25lZCBzZXF1ZW5jZXMuIEl0IG1lYXN1cmVzIHRoZSBudW1iZXIgb2YgaWRlbnRpY2FsIHJlc2lkdWVzICjigJxtYXRjaGVz4oCdKSBpbiByZWxhdGlvbiB0byB0aGUgbGVuZ3RoIG9mIHRoZSBhbGlnbm1lbnQuIEZpbmFsbHksIHJvb3QgbWVhbiBzcXVhcmUgZGV2aWF0aW9uIChSTVNEKSBpcyBjYWxjdWxhdGVkIHRvIG1lYXN1cmUgc3RydWN0dXJhbCBzaW1pbGFyaXR5IG9mIHRoZSBETkEtYmluZGluZyBkb21haW5zIG9mIHRoZSB0aHJlZSBwcm90ZWlucy4KCmBgYHtyfQojIFJlYWQgcGRiIGZpbGVzIG9mIHRoZSBETkEgYmluZGluZyBkb21haW5zIG9mIHA1MyAoMkZFSiksIHA2MyAoMlJNTiksIGFuZCBwNzMgKDJYV0MpIHVzaW5nIHRoZSByZWFkLnBkYigpIGZ1bmN0aW9uIGZyb20gdGhlIGJpbzNkIHBhY2thZ2UgYnkgcHJvdmlkaW5nIHRoZSBmaWxlIHBhdGhzIChvciBQREIgYWNjZXNzaW9uIG51bWJlcnMpIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgdmFyaWFibGVzICJwNTNfcGRiIiwgInA2M19wZGIiLCBhbmQgInA3M19wZGIpCnA1M19wZGIgPC0gcmVhZC5wZGIoIjJmZWoucGRiIikKcDYzX3BkYiA8LSByZWFkLnBkYigiMnJtbi5wZGIiKQpwNzNfcGRiIDwtIHJlYWQucGRiKCIyeHdjLnBkYiIpCgojIENyZWF0ZSBhIG11bHRpcGxlIHNlcXVlbmNlIGFsaWdubWVudCBvZiB0aGUgUERCIGZpbGVzIHVzaW5nIHRoZSBwZGJhbG4oKSBmdW5jdGlvbiBhbmQgYXNzaWduIGl0IHRvIHRoZSB2YXJpYWJsZSAicGRicyIKcGRicyA8LSBwZGJhbG4oYygiMmZlai5wZGIiLCAiMnJtbi5wZGIiLCAiMnh3Yy5wZGIiKSwgZml0PVRSVUUsIHdlYi5hcmdzID0gbGlzdChlbWFpbCA9ICJha3Jpc3RpbkB1Y3NkLmVkdSIpKQoKIyBQcmludCAicGRicyIgdG8gdmlldyB0aGUgYWxpZ25tZW50CnBkYnMKCiMgQ2FsY3VsYXRlIHBlcmNlbnQgc2VxdWVuY2UgaWRlbnRpdHkgYW5kIGFzc2lnbiB0aGUgcmVzdWx0aW5nIG1hdHJpeCBhcnJheSB0byB0aGUgdmFyaWFibGUgInNlcWlkIgpzZXFpZCA8LSBzZXFpZGVudGl0eShwZGJzKQoKIyBSZW5hbWUgY29sdW1uIGFuZCByb3cgbmFtZXMgZm9yIGVhc3kgaW50ZXJwcmV0YXRpb24KY29sbmFtZXMoc2VxaWQpIDwtIGMoInA1MyIsICJwNjMiLCAicDczIikKcm93bmFtZXMoc2VxaWQpIDwtIGMoInA1MyIsICJwNjMiLCAicDczIikKCiMgUHJpbnQgcmVuYW1lZCBtYXRyaXgKc2VxaWQKCiMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gaW50ZXJwcmV0IHNlcXVlbmNlIGlkZW50aXR5IHZhbHVlcyB0aGF0IHJldHVybnMgImhvbW9sb2ciIGlmIHZhbHVlIGlzID4gMC41IG9yIDUwJSBhbmQgcmV0dXJucyAibm9uLWhvbW9sb2ciIGlmIHZhbHVlIGlzID08IDAuNQppbnRlcnByZXQgPC0gZnVuY3Rpb24oc2VxaWQpewogIGlmIChzZXFpZCA+IDAuNSkgewogICAgcHJpbnQgKCJob21vbG9nIikKICAgIHJldHVybihzZXFpZCkKICB9IGVsc2UgewogICAgcHJpbnQgKCJub24taG9tb2xvZyIpCiAgICByZXR1cm4gKHNlcWlkKQogIH0KfQoKIyBDcmVhdGUgdmFyaWFibGVzIGZvciBlYWNoIHBhaXJpbmcgb2YgdGhlIDMgcHJvdGVpbnMKcDUzYW5kcDYzIDwtIHNlcWlkWzIsMV0KcDUzYW5kcDczIDwtIHNlcWlkWzMsMV0KcDYzYW5kcDczIDwtIHNlcWlkWzIsM10KCiMgVXNlIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHRvIGludGVycHJldCBzZXF1ZW5jZSBpZGVudGl0eSB2YWx1ZXMKaW50ZXJwcmV0KHA1M2FuZHA2MykKaW50ZXJwcmV0KHA1M2FuZHA3MykKaW50ZXJwcmV0KHA2M2FuZHA3MykKCiMgQ2FsY3VsYXRlIFJNU0QgdG8gbWVhc3VyZSBzdHJ1Y3R1cmFsIHNpbWlsYXJpdHkKcm1zZCA8LSBybXNkKHBkYnMsIGZpdCA9IFRSVUUpCgojIFJlbmFtZSBjb2x1bW4gYW5kIHJvdyBuYW1lcyBmb3IgZWFzeSBpbnRlcnByZXRhdGlvbgpjb2xuYW1lcyhybXNkKSA8LSBjKCJwNTMiLCAicDYzIiwgInA3MyIpCnJvd25hbWVzKHJtc2QpIDwtIGMoInA1MyIsICJwNjMiLCAicDczIikKCiMgUHJpbnQgcmVuYW1lZCBtYXRyaXgKcm1zZApgYGAKCiMjIFBsb3R0aW5nIHRoZSBSZXN1bHRzICgxNSBwb2ludHMpCiMjIyBtc2FQcmV0dHlQcmludDogbXNhUHJldHR5UHJpbnQgaXMgYSBmdW5jdGlvbiB0aGF0IGFsbG93cyBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG11bHRpcGxlIHNlcXVlbmNlIGFsaWdubWVudCB0aGF0IHNob3dzIHRoZSBzZXF1ZW5jZSBjb25zZXJ2YXRpb24gb2YgYW1pbm8gYWNpZHMgaW4gYSBzZXF1ZW5jZSBsb2dvLiBUaGUgbGVmdCBoYW5kIHNpZGUgc2hvd3MgdGhlIElEIGFuZCBuYW1lIG9mIHRoZSAzIHByb3RlaW5zIChwNTMsIHA2MywgYW5kIHA3MykgYW5kIHRoZSBjb25zZW5zdXMgc2VxdWVuY2UgYmFzZWQgb24gdGhpcyBhbGlnbm1lbnQuIFRoZSBjb2xvcmZ1bCBzdGFjayBvZiBsZXR0ZXJzIGF0IGVhY2ggcG9zaXRpb24gb24gdG9wIG9mIHRoZSBzZXF1ZW5jZSBhbGlnbm1lbnQgaXMgdGhlIHNlcXVlbmNlIGxvZ28sIHdoZXJlIHRoZSByZWxhdGl2ZSBzaXplcyBvZiB0aGUgbGV0dGVycyBpbmRpY2F0ZSB0aGVpciBmcmVxdWVuY3kgaW4gdGhlIHNlcXVlbmNlcy4gCgpgYGB7cn0KIyBVc2UgbXNhUHJldHR5UHJpbnQgdG8gZ2VuZXJhdGUgdGhlIHNlcXVlbmNlIGxvZ29zLiBUaGUgb3V0cHV0IGlzIGEgLnRleCBhbmQgYSBwZGYgZmlsZQptc2FQcmV0dHlQcmludChtc2EsIG91dHB1dCA9ICJ0ZXgiLCBzaG93TmFtZXMgPSAibGVmdCIsIHNob3dMb2dvID0gInRvcCIsIGxvZ29Db2xvcnMgPSAicmFzbW9sIiwgc2hhZGluZ01vZGUgPSAiZnVuY3Rpb25hbCIsIHNoYWRpbmdNb2RlQXJnID0gInN0cnVjdHVyZSIsIHNob3dMZWdlbmQgPSBGQUxTRSwgYXNrRm9yT3ZlcndyaXRlID0gRkFMU0UpCgojIE9uZSBvZiB0aGUgb3V0cHV0IGZpbGVzIGlzIGEgcGRmIGZpbGUsIHdoaWNoIHdhcyBzY3JlZW5zaG90IGFuZCBrbml0dGVkIGFzIHBuZydzCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJtc2FTZXF1ZW5jZUxvZ29zMS5wbmciKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibXNhU2VxdWVuY2VMb2dvczIucG5nIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIm1zYVNlcXVlbmNlTG9nb3MzLnBuZyIpCmBgYAoKIyMjIE5HTFZpZXdlUjogTkdMVmlld2VSIGlzIHVzZWQgdG8gdmlzdWFsaXplIHRoZSAzRCBzdHJ1Y3R1cmUgb2YgdGhlIHBkYiBmaWxlcy4gQmVsb3cgaXMgdGhlIGNvZGUgdG8gdmlzdWFsaXplIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEROQS1iaW5kaW5nIGRvbWFpbnMgb2YgcHJvdGVpbnMgcDUzLCBwNjMsIGFuZCBwNzMsIHVzaW5nIHRoZWlyIFBEQiBhY2Nlc3Npb24gY29kZXMgMkZFSiwgMlJNTiwgYW5kIDJYV0MgcmVzcGVjdGl2ZWx5LgpgYGB7cn0KIyMgU291cmNlOjogaHR0cHM6Ly9naXRodWIuY29tL252ZWxkZW4vTkdMVmlld2VSIzp+OnRleHQ9TkdMdmlld2VSJTIwcHJvdmlkZXMlMjBhbiUyMFIlMjBpbnRlcmZhY2UsaW4lMjBSJTIwYW5kJTIwU2hpbnklMjBhcHBsaWNhdGlvbnMuCiMjIFNvdXJjZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL05HTFZpZXdlUi92aWduZXR0ZXMvTkdMVmlld2VSLmh0bWwKCiMgVmlldyBzdHJ1Y3R1cmUgb2YgdGhlIEROQS1iaW5kaW5nIGRvbWFpbiBvZiBwNTMKTkdMVmlld2VSKCIyRkVKIikgJT4lCmFkZFJlcHJlc2VudGF0aW9uKCJjYXJ0b29uIikKCiMgVmlldyBzdHJ1Y3R1cmUgb2YgdGhlIEROQS1iaW5kaW5nIGRvbWFpbiBvZiBwNjMKTkdMVmlld2VSKCIyUk1OIikgJT4lCmFkZFJlcHJlc2VudGF0aW9uKCJjYXJ0b29uIikKCiMgVmlldyBzdHJ1Y3R1cmUgb2YgdGhlIEROQS1iaW5kaW5nIGRvbWFpbiBvZiBwNzMKTkdMVmlld2VSKCIyWFdDIikgJT4lCmFkZFJlcHJlc2VudGF0aW9uKCJjYXJ0b29uIikKYGBgCgojIyBBbmFseXppbmcgdGhlIFJlc3VsdHMgKDE1IHBvaW50cykKTXVsdGlwbGUgc2VxdWVuY2UgYWxpZ25tZW50IG9uIHA1MywgcDYzLCBhbmQgcDczIHByb3RlaW4gc2VxdWVuY2VzIHdlcmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBtc2EgZnVuY3Rpb24gd2l0aCB0aGUgTVVTQ0xFIGFsZ29yaXRobS4gQSBkYXNoIGluIG9uZSBzZXF1ZW5jZSAoLSkgaW5kaWNhdGVzIGEgZGVsZXRpb24gaW4gdGhhdCByZXNpZHVlIHBvc2l0aW9uLCBvciBhIG1pc3NpbmcvdHJ1bmNhdGVkIHNlcXVlbmNlIGNvbXBhcmVkIHRvIHRoZSBvdGhlciBzZXF1ZW5jZXMgYWxpZ25lZC4gQXMgc2hvd24gaW4gdGhlIGFsaWdubWVudCwgcDYzIGFuZCBwNzMgYXJlIG1vcmUgc2ltaWxhciBpbiBsZW5ndGggKDY4MCBhbmQgNjM2IGFtaW5vIGFjaWQgcmVzaWR1ZXMpIGNvbXBhcmVkIHRvIHA1MyAob25seSAzOTMgcmVzaWR1ZXMpLiBJdCBjYW4gYmUgb2JzZXJ2ZWQgaW4gdGhlIGFsaWdubWVudCB0aGF0IHA1MyBoYXMgYSBzaG9ydGVyL3RydW5jYXRlZCBDLXRlcm1pbmFsIHJlZ2lvbiBjb21wYXJlZCB0byBwNjMgYW5kIHA3MywgYXMgcDUzIHNob3dzIG1vc3RseSBkYXNoZXMgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBhbGlnbm1lbnQgKGFwcHJveGltYXRlbHkgcG9zaXRpb25zIDQzNC03MDQpLiBUaGlzIHN1cHBvcnRzIHRoZSBwcmV2aW91cyBmaW5kaW5ncyB0aGF0IGFuIGV4dGVuZGVkIEMtdGVybWluYWwgcmVnaW9uIGNvbnRhaW5pbmcgYSBzdGVyaWxlIGFscGhhIG1vdGlmIChTQU0pIGtub3duIHRvIHJlZ3VsYXRlIGRldmVsb3BtZW50IGlzIGFsdGVybmF0aXZlbHkgc3BsaWNlZCBpbiBwNjMgYW5kIHA3MyBidXQgbm90IGluIHA1Mywgd2hpY2ggc3VnZ2VzdHMgdGhhdCBwNjMgYW5kIHA3MyBwbGF5IGFuIGFkZGl0aW9uYWwgc2VwYXJhdGUgcm9sZSBpbiByZWd1bGF0aW5nIG5vcm1hbCBkZXZlbG9wbWVudCAoTGV2cmVybyAyMDAwKS4gRGVzcGl0ZSBzbywgdGhlIG1ham9yaXR5IG9mIHRoZSBETkEtYmluZGluZyBkb21haW4gcmVzaWR1ZXMgKHVzdWFsbHkgZGVmaW5lZCBhcyByZXNpZHVlcyA5NC0yOTIgaW4gcDUzKSBhcmUgY29uc2VydmVkIGFjcm9zcyB0aGUgMyBwcm90ZWlucyBhcyBldmlkZW50IGZyb20gdGhlIHNlcXVlbmNlIGxvZ28uIAoKRm9sbG93aW5nIHRoaXMgb2JzZXJ2YXRpb24sIHRoZSBETkEtYmluZGluZyBkb21haW5zIG9mIHA1MywgcDYzLCBhbmQgcDczIGFyZSBhbmFseXplZCBieSBwZXJmb3JtaW5nIGEgIG11bHRpcGxlIHNlcXVlbmNlIGFsaWdubWVudCBvbiB0aGUgcGRiIGZpbGVzIG9mIHRoZSBETkEtYmluZGluZyBkb21haW4gc3RydWN0dXJlcyBvZiB0aGUgMyBwcm90ZWlucy4gQXMgc2hvd24gaW4gdGhlIGFsaWdubWVudCwgdGhlcmUgYXJlIGxlc3MgZGFzaGVzIG9ic2VydmVkLCBtZWFuaW5nIHRoZXJlIGFyZW4ndCBtYW55IGluZGVscyBpbiB0aGUgREJELCByZXNpZHVlcyBpbiB0aGUgREJEIG9mIHRoZSAzIHByb3RlaW5zIGFyZSBtb3N0bHkgY29uc2VydmVkLiBVc2luZyB0aGUgcmVzdWx0aW5nIHBkYiBhbGlnbm1lbnQsIHRoZWlyIHNlcXVlbmNlIGlkZW50aXR5IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIHNlcWlkZW50aXR5KCkgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYSBtYXRyaXggb2Ygc2VxdWVuY2UgaWRlbnRpdHkgdmFsdWVzIGJldHdlZW4gdGhlIDMgcHJvdGVpbnMuIFVzaW5nIHRoZSBjcmVhdGVkIGludGVycHJldCgpIGZ1bmN0aW9uLCBpdCBjYW4gYmUgb2JzZXJ2ZWQgdGhhdCBhbGwgMyBwcm90ZWlucyBhcmUgImhvbW9sb2dzIiB0byBlYWNoIG90aGVyIGFzIHRoZWlyIHNlcXVlbmNlIGlkZW50aXR5IGlzIGdyZWF0ZXIgdGhhbiA1MCUuIFRoZSBzZXF1ZW5jZSBpZGVudGl0eSBiZXR3ZWVuIHA1MyBhbmQgcDYzIGlzIDU1LjQlOyBwNTMgYW5kIHA3MyBpcyA1Ni43JTsgcDYzIGFuZCBwNzMgaXMgODIuNCUuIENvbnNpc3RlbnQgd2l0aCBvdXIgcHJldmlvdXMgb2JzZXJ2YXRpb25zIGZyb20gdGhlIGFsaWdtZW50cyBwZXJmb3JtZWQsIHA2MyBhbmQgcDczIGFyZSBtb3JlIHNpbWlsYXIgdG8gZWFjaCBvdGhlciB0aGFuIHRvIHA1My4gVGhlIHNlcXVlbmNlIGlkZW50aXR5IGJldHdlZW4gcDUzIGFuZCBwNjMgY29tcGFyZWQgdG8gcDUzIGFuZCBwNzMgaXMgYWxtb3N0IHRoZSBzYW1lLCB3aXRoIHA3MyBiZWluZyBzbGlnaHRseSBtb3JlIHNpbWlsYXIgdG8gcDUzLiBGaW5hbGx5LCByb290LW1lYW4tc3F1YXJlIGRldmlhdGlvbiB2YWx1ZXMgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgcm1zZCgpIGZ1bmN0aW9uLiBUaGUgcm1zZCB2YWx1ZSBnaXZlcyB0aGUgYXZlcmFnZSBkZXZpYXRpb24gYmV0d2VlbiB0aGUgY29ycmVzcG9uZGluZyBhdG9tcyBvZiB0d28gcHJvdGVpbnM6IHRoZSBzbWFsbGVyIHRoZSBybXNkLCB0aGUgbW9yZSBzaW1pbGFyIHRoZSB0d28gc3RydWN0dXJlczsgdGhlIHJtc2Qgd291bGQgYmUgMCBiZXR3ZWVuIGlkZW50aWNhbCBzdHJ1Y3R1cmVzLiBUaGUgcm1zZCB2YWx1ZXMgbWF0cml4IHNob3dzIHRoYXQgdGhlIHZhbHVlIGJldHdlZW4gcDUzIGFuZCBwNjMgaXMgNC45ODA7IHA1MyBhbmQgcDczIGlzIDIuOTc5OyBwNjMgYW5kIHA3MyBpcyA0LjAwNC4gR2VuZXJhbGx5LCBhIHZhbHVlIG9mIDwgMiBpcyBjb25zaWRlcmVkIHN0cnVjdHVyYWxseSB2ZXJ5IHNpbWlsYXIuIEJhc2VkIG9uIHRoZXNlIHZhbHVlcywgcDUzIGFuZCBwNzMgaXMgbW9zdCBzdHJ1Y3R1cmFsbHkgc2ltaWxhciwgZm9sbG93ZWQgYnkgcDYzIGFuZCBwNzMsIGFuZCBmaW5hbGx5IHA1MyBhbmQgcDYzIGFsdGhvdWdoIHRoZXkgYXJlIGFsbCBhYm92ZSAyLiBNZWFuaW5nLCBkZXNwaXRlIHRoZWlyIGhpZ2ggc2VxdWVuY2UgaWRlbnRpdGllcywgdGhlIDMgcHJvdGVpbnMgYXJlIHN0cnVjdHVyYWxseSBkaXN0aW5jdCBpbiB0aGVpciBEQkQuIFRoaXMgaXMgZXZpZGVudCBieSB2aXN1YWxpemF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmVzIHVzaW5nIE5HTFZpZXdlUiBhcyB3ZWxsOyB3aGlsZSBhbGwgdGhlIDMgc3RydWN0dXJlcyBzZWVtIGRpc3RpbmN0LCBwNTMgYW5kIHA3MyBsb29rIHRoZSBtb3N0IHNpbWlsYXIgYXMgdGhleSBhcmUgc3BoZXJpY2FsIGluIHNoYXBlLCB3aGlsZSBwNjMgbG9va3MgbGlrZSBpdCBoYXMgdHdvICJkb21haW5zIiB3aXRoIGEgYnJpZGdlIGNvbm5lY3RpbmcgdGhlIHR3by4gCgpCYXNlZCBvbiB0aGVzZSBhbmFseXNlcywgbXkgaHlwb3RoZXNpcyB3YXMgcGFydGlhbGx5IGNvcnJlY3QsIGFzIHRoZSBzZXF1ZW5jZSBpZGVudGl0aWVzIGJldHdlZW4gdGhlIDMgcHJvdGVpbnMgYXJlID41MCUuIEhvd2V2ZXIsIGl0IGlzIHN0aWxsIGFuZCB1bmNsZWFyIHdoZXRoZXIgdGhlIHA1MyBmYW1pbHkgb2YgcHJvdGVpbnMgc2VydmUgdGhlIHNhbWUgb3IgZGlzdGluY3QgZnVuY3Rpb25zOyBjb25zaXN0ZW50IHdpdGggd2hhdCB3ZSBrbm93IHRvZGF5LCB0aGUgcDUzIGZhbWlseSBoYXMgc29tZSBvdmVybGFwcGluZyBmdW5jdGlvbnMgYnV0IGFsc28gZGlzdGluY3Qgb25lcywgd2hpY2ggY2FuIGJlIGV4cGxhaW5lZCBieSB0aGVpciBzZWVtaW5nbHkgc2ltaWxhciBzZXF1ZW5jZSBpZGVudGl0aWVzLCBlc3BlY2lhbGx5IGluIHRoZSBETkEtYmluZGluZyBkb21haW4sIGJ1dCBub3Qgc28gc2ltaWxhciBpbiBzdHJ1Y3R1cmUuIA==